/* !
 * @Author: miss-tree
 * @Date: 2024-12-28 16:52:25
 * @Description: 视频直播和聊天
*/
const express = require('express');
const router = express.Router();
const fs = require('fs');
const path = require('path');
// const ffmpeg = require('fluent-ffmpeg');
const { UploadVideo } = require('../utils/upload.js');
const { exec } = require('child_process');
const ffmpegPath = require('ffmpeg-static');
//! 安装ffmpeg是否成功判断
/** npx ffmpeg -version
 * npx ffprobe -version
 */

// 将视频压缩，在生产环境中一般考虑将视频放到第三方服务器读取，否则服务器带宽压力大
/** 此接口会消耗大量系统资源 生产考虑队列或者异步处理阻塞 */
router.get('/convert-video', (req, res) => {
 const inputVideo = 'public/video/WIN_20230705_22_45_31_Pro.mp4';
 const outputVideo = 'public/video/test1.mp4';
 // 检查目标文件是否已经存在
 if (fs.existsSync(outputVideo)) {
  return res.send({ message: '目标文件已存在，跳过转换' });
 }
 // 使用FFmpeg进行视频转换
 // -c:v libx264: -c:v 是视频编码器选项，libx264 是一个广泛使用的视频编码器，用于将视频编码为H.264格式。
 // -c:a aac: -c:a 是音频编码器选项，aac 是一种常用的音频编码器，用于将音频编码为AAC格式。
 const ffmpegCommand = `${ffmpegPath} -i ${inputVideo} -c:v libx264 -c:a aac ${outputVideo}`;

 exec(ffmpegCommand, (error, stdout, stderr) => {
  if (error) {
   console.error(`执行FFmpeg命令时出错: ${error}`);
   // console.log(`执行FFmpeg命令时出错: stdout, stderr`,stdout, stderr);
   return res.status(500).send('视频转换失败');
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
  res.send('视频转换成功');
 });
});


// 直播流程：1、上传视频；2、用户访问直播片段；3、直播完成合并视频；4、返回视频链接

router.get('/upload', UploadVideo.single('videoChunk'), (req, res) => {
 const chunk = req.file;videoId
 const fileName = chunk.originalname; 
 const filePath = path.join(__dirname, `videos/${req.body.videoId}/${req.body.ChunkIndex}`, fileName);

 // 将上传的视频块保存到服务器
 fs.renameSync(chunk.path, filePath);

 res.json({ message: 'Chunk uploaded successfully' });
});

// app.get('/merge', (req, res) => {
//  const files = fs.readdirSync('videos');
//  const outputFile = path.join(__dirname, 'merged-video.webm');

//  // 使用ffmpeg合并视频块
//  ffmpeg()
//   .input(files.map(file => path.join('videos', file)).join('|'))
//   .inputOptions('-f concat -safe 0')
//   .output(outputFile)
//   .on('end', () => {
//    res.download(outputFile, 'merged-video.webm', () => {
//     // 删除上传的视频块和合并后的视频文件
//     files.forEach(file => fs.unlinkSync(path.join('videos', file)));
//     fs.unlinkSync(outputFile);
//    });
//   })
//   .on('error', (err) => {
//    console.error('Error:', err);
//    res.status(500).send('Error merging video');
//   })
//   .run();
// });


module.exports = router;

// router.get('/convert-video', (req, res) => {
//   const inputVideo = 'public/video/WIN_20230705_22_45_31_Pro.mp4';
//   const outputVideo = 'public/video/test1.mp4';

//   videoQueue.add({ inputVideo, outputVideo });
//   res.send('视频转换任务已添加到队列');
// });

// const Queue = require('bull');
// const videoQueue = new Queue('video-conversion');

// videoQueue.process(async (job, done) => {
//   const { inputVideo, outputVideo } = job.data;
//   const ffmpegCommand = `${ffmpegPath} -i ${inputVideo} -c:v libx264 -c:a aac ${outputVideo}`;

//   exec(ffmpegCommand, (error, stdout, stderr) => {
//     if (error) {
//       console.error(`执行FFmpeg命令时出错: ${error}`);
//       return done(new Error('视频转换失败'));
//     }
//     console.log(`stdout: ${stdout}`);
//     console.error(`stderr: ${stderr}`;
//     done();
//   });
// });
